<?php
namespace app\controller;

use app\BaseController;
use app\model\AdminModel;
use app\model\UserModel;
use App\Models\User;
use app\Request;
use app\validate\UserValidate;
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use think\facade\Db;
use think\exception\ValidateException;
use think\facade\Filesystem;
use think\facade\Log;
use think\facade\Validate;

class Index extends BaseController
{
    public function index()
    {
        Log::write('index');
        dd('tp6');
        return '<style type="text/css">*{ padding: 0; margin: 0; } div{ padding: 4px 48px;} a{color:#2E5CD5;cursor: pointer;text-decoration: none} a:hover{text-decoration:underline; } body{ background: #fff; font-family: "Century Gothic","Microsoft yahei"; color: #333;font-size:18px;} h1{ font-size: 100px; font-weight: normal; margin-bottom: 12px; } p{ line-height: 1.6em; font-size: 42px }</style><div style="padding: 24px 48px;"> <h1>:) </h1><p> ThinkPHP V' . \think\facade\App::version() . '<br/><span style="font-size:30px;">16载初心不改 - 你值得信赖的PHP框架</span></p><span style="font-size:25px;">[ V6.0 版本由 <a href="https://www.yisu.com/" target="yisu">亿速云</a> 独家赞助发布 ]</span></div><script type="text/javascript" src="https://e.topthink.com/Public/static/client.js"></script><think id="ee9b1aa918103c4fc"></think>';
    }

    public function hello($name = 'ThinkPHP6')
    {
        return 'hello,' . $name;
    }

    public function log()
    {
        ////runtime/年月/日.log
        //$res=Log::record('测试日志信息');

        //默认记录的日志级别是info，也可以指定日志级别：
        //Log::record('测试日志信息，这是警告级别','notice');

        //采用record方法记录的日志信息不是实时保存的，如果需要实时记录的话，可以采用write方法，例如：
        //Log::write('测试日志信息，并且实时写入');

//        //采用record方法记录的日志信息不是实时保存的，如果需要实时记录的话，可以采用write方法，例如：
        //Log::write('测试日志信息，这是警告级别，并且实时写入','notice');

        // 关闭当前日志写入
//        Log::close();
//        //关闭后不会写入 前提要写入日志过
//        Log::write('关闭后写入');

        //Log::error('错误信息');
        //Log::info('日志信息');

        //助手函数用于日志记录
//        trace('错误信息', 'error');
//        trace('日志信息', 'info');

        //自定义的日志类型
        //Log::diy('这是一个自定义日志类型');

        //实际写入日志的时候，{user}会被替换为流年。
        //Log::info('日志信息{user}', ['user' => '流年']);


        // 获取全部日志
        //$logs = Log::getLog();

        //dd(runtime_path('/test/2023-11-09/'));

        //Log::channel('email')->

        //配置不同的日志通道，并且把不同的日志记录到不同的通道。
        //Log::channel('email')->info('一条测试日志');

        $data=Db::table('test')->select()->toArray();

        //dd($data);

        Log::channel('email')->info(var_export($data,JSON_UNESCAPED_UNICODE)."\n\n");

        //向多个通道写入日志
        //Log::channel(['email', 'file'])->info('这是日志信息');

//        $error = Log::getLog('email');

        return success();
    }


    public function zipDownload()
    {
        //要压缩的目录
        $dir =  app()->getRootPath().'public/storage/excel/20231109/';
        //压缩包名 存放位置
        $zipName = "./aaa.zip";//dd($zipName);
        // 如果压缩文件不存在，就创建压缩文件
        if (!is_file($zipName)) {
            $fp = fopen($zipName, 'w');
            fclose($fp);
        }
        $zip = new \ZipArchive();
        // OVERWRITE选项表示每次压缩时都覆盖原有内容，但是如果没有那个压缩文件的话就会报错，所以事先要创建好压缩文件
        // 也可以使用CREATE选项，此选项表示每次压缩时都是追加，不是覆盖，如果事先压缩文件不存在会自动创建

       // dd();
        if ($zip->open($zipName, \ZipArchive::OVERWRITE) === true) {
            $this->addFileToZip($dir, $zip);//压缩目录下的各个文件，这个函数是自己写的，要加在自己的php文件中
            $zip->close();

            header("Content-Type: application/zip");
            header("Content-Transfer-Encoding: Binary");

            header("Content-Length: " . filesize($zipName));
            header("Content-Disposition: attachment; filename=\"" . basename($zipName) . "\"");
            ob_clean(); flush();
            readfile($zipName);
            unlink($zipName);//完成所有操作 删除压缩包
        } else {
            exit('下载失败！');
        }

    }

    public function addFileToZip($path,$zip)
    {
        $handler=opendir($path); //打开当前文件夹由$path指定。
        while(($filename=readdir($handler))!==false){
            if($filename != "." && $filename != ".."){//文件夹文件名字为'.'和‘..’，不要对他们进行操作
                if(is_dir($path."/".$filename)){
                    $this->addFileToZip($path."/".$filename, $zip);
                }else{
                    $zip->addFile($path."/".$filename);
                }
            }
        }
        @closedir($path);
    }


    public function createDatabase()
    {

        $add=[
            'name'=>'万明明',
            'num'=>'-100'
        ];//dd($add);

        $res=Db::table('test')->where('id',45)->dec('num',10)->update();


        dd($res);
        $admin=new AdminModel();

        //$data=$admin::select()->toArray();


        //dd($data);

        //创建表
//        $sql = <<<sql
//                CREATE TABLE `system_novel_one` (
//                `id` int(11) NOT NULL AUTO_INCREMENT,
//                `name` char(200) DEFAULT NULL COMMENT '章节名称',
//                `contents` text COMMENT '章节文字',
//                `next` int(11) DEFAULT NULL COMMENT '下一章地址',
//                `pid` int(11) DEFAULT NULL COMMENT '小说名称',
//                `novel_url` char(50) DEFAULT NULL COMMENT '小说章节地址',
//                PRIMARY KEY (`id`)
//                ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
//sql;
//
//        dump(Db::execute($sql));

//        $tableName = config('database.prefix').'think_order_'.date('Ymd');//dd($tableName);
//        $isTable = Db::query('SHOW TABLES LIKE '."'".$tableName."'");
//        if($isTable){
//            //已存在
//        }else{
//            //未存在
//            $time=date('Ymd');
//            $sql = <<<sql
//          CREATE TABLE IF NOT EXISTS `cmj_think_order_$time`(
//          `order_id` int(8) unsigned NOT NULL AUTO_INCREMENT,
//          `out_trade_no` varchar(255) NOT NULL,
//            PRIMARY KEY (`order_id`)
//          )
//          ENGINE=MyISAM
//          DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
//          CHECKSUM=0
//          ROW_FORMAT=DYNAMIC
//          DELAY_KEY_WRITE=0
//          ;
//sql;
//            $a=Db::execute($sql);
//
//            dd($a);
      //  }

        $dbName='aaa';
        Db::execute("DROP DATABASE If Exists `$dbName`;");

        $res=Db::execute("create database `$dbName`;");



        // 检测库中是否存在新加的表
        foreach (C('NEW_ADD_TABLES') as $tbName => $tbStatement) {
            $existsT = $m->execute("SHOW TABLES LIKE '{$tbName}'");
            if (!$existsT) {
                $m->execute($tbStatement);
            }
            $tableName[] = $tbName;
        }

        $m->db(2,[
            'db_type'  =>  C('DB_TYPE'),
            'db_user'  =>  C('DB_USER'),
            'db_pwd'   =>  C('DB_PWD'),
            'db_host'  =>  C('DB_HOST'),
            'db_port'  =>  C('DB_PORT'),
            'db_name'  =>  $dbName     ,
        ]);
        dd($res);

    }



    public function import()
    {

//        $data= Db::connect('demo')->table('match')->select()->toArray();
//
//        dd($data);

        //模型数据库查询 动态数据库
       // $data=UserModel::select()->toArray();//dd($data);

        $uploadFile = request()->file('file');
        //保存文件到本地  public/storage/excel/20231109\d7126c17ad28f4896750a4fd8e0694db.xlsx
        $saveName = Filesystem::disk('public')->putFile('excel', $uploadFile);//dd($saveName);
        //获取保存文件地址  excel/20231109\a281cd39dd32ad5708cd46e2810d2472.xlsx
        $filePath = Filesystem::disk('public')->path($saveName);//dd($saveName);

        $spreadsheet = IOFactory::load($filePath);
        $sheet = $spreadsheet->getActiveSheet();
        //行
        $highestRow = $sheet->getHighestRow();


        $data = [];

        for($i = 2; $i <= $highestRow; $i++){

            //$item['id'] = $sheet->getCell("A$i")->getValue();
            $item['name'] = $sheet->getCell("B$i")->getValue();
            $item['date'] = $sheet->getCell("C$i")->getValue();

            $item['create_time']=date('Y-m-d H:i:s');

            $data[] = $item;

            try {
                validate(UserValidate::class)->check($item);
            } catch (ValidateException $e) {
                // 验证失败 输出错误信息 ->batch(true) 全部验证，返回数据是数组
                //dd($e->getError());
                unlink($filePath);
                return error(0,'第'.$i.'行'.$e->getError());
            }

//            $validate = Validate::rule('age', 'number|between:1,120')
//                ->rule([
//                    'name|姓名'  => 'require|max:2',
//                    'email' => 'email'
//                ]);
//
//            if (!$validate->check($item)) {
//                unlink($filePath);
//                return error(0,'第'.$i.'行'.$validate->getError());
//            }

        }

        Db::startTrans();
        try {

           $res= Db::table('test')->insertAll($data);
           if (!$res){
               unlink($filePath);
               Db::rollback();
               return error(0,'数据入库失败，导入失败');
           }

            Db::commit();
            return success(1,'导入成功');
        } catch (\Exception $e) {

            unlink($filePath);
            Db::rollback();
            //dd($e->getMessage());
            return json(['code' => '500', 'msg' => '发送异常：'.$e->getMessage().$e->getLine()]);
        }

    }

    public function export()
    {

        $data=Db::table('test')->select()->toArray();//dd($data);

        $spreadsheet = new Spreadsheet();
        $sheet = $spreadsheet->getActiveSheet();
        $sheet->setTitle('学生信息表');

        $sheet->setCellValue('A1', '序号');
        $sheet->setCellValue('B1', '姓名');
        $sheet->setCellValue('C1', '日期');

        foreach ($data as $key => $item) {
            $num = $key + 2;
            $sheet->setCellValue('A' . $num, $item['id']);
            $sheet->setCellValue('B' . $num, $item['name']);
            $sheet->setCellValue('C' . $num, $item['create_time']);
        }

        $writer = new Xlsx($spreadsheet);
        $filename = "学生信息表.xlsx";
        header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
        header('Content-Disposition: attachment;filename=' . $filename);
        header('Cache-Control: max-age=0');
        $writer->save('php://output');
        exit();

    }



    public function getInfo()
    {

       // $user = AdminModel::find(1);

        // 通过获取器获取字段
//       $status = $user->status;
//       echo $status;

        // 获取原始字段数据
        //echo $user->getData('status');

//        $name = $user->name;
//        echo $name;
//
//
//        $info = $user->getData();
//        dd($info);

//        $data = (new \app\model\AdminModel)->withAttr('name', function($value, $data) {
//
//            return strtolower($value);
//        })->select()->toArray();
//
//        dd($data);
    }


    public function update()
    {
        //修改器
        $user = new AdminModel();

//        $user->name = 'wmm';
//
//        $rs= $user->save();


        $data['name'] = 'wmm';
        //修改器无效
        $rs=$user->insert($data);

        dd($rs);
    }

    public function search(Request $request)
    {
        $name=$request->get('name','','trim');

        $obj=new AdminModel();
        $data=$obj->withSearch(['name'],[//,'status'
            'name'=>$name,
            'status'=>1,
            'sort'=>['id'=>'desc']
        ])->select()->toArray();

        //别名
//        $data=$obj->withSearch(['name'=>'username'],[//,'status'
//            'username'=>$name,
//            'status'=>1,
//            'sort'=>['id'=>'desc']
//        ])->select()->toArray();

        //$sql=$obj->getlastsql();

        dd($data);
    }

    //类型转换
    public function typeChange()
    {
//        $user = new AdminModel();
//        $user->status = '1';
//        $user->score = '90.50';
//        $user->date = '2015/5/1';
//        $user->info = ['a'=>1,'b'=>2];
//        $user->save();
//
////        $select = AdminModel::find(1);
////        echo $select['status'];exit();
//
//        $select = AdminModel::select()->toArray();
//        dd($select);
//
//        var_dump($user->getData('status')); // int 1
//        var_dump($user->score); // float 90.5;
//        var_dump($user->date); // string '2015-05-01 00:00:00'
//        var_dump($user->info);// array (size=2) 'a' => int 1  'b' => int 2

//        $user = AdminModel::find(1);
//        //隐藏 create_time 字段
//        $data=$user->hidden(['create_time'])->toArray();
//        dump($data);

        //数组输出的字段值会经过获取器的处理，也可以支持追加其它获取器定义（不在数据表字段列表中）的字段，例如
        //增加字段 status_text 可以用获取器进行字段处理
        //$user = AdminModel::find(7);
//        $user = AdminModel::select();
//        dump($user->append(['status_text'])->toArray());

        //支持设置允许输出的属性， 会过滤不存在的字段
//        $user = AdminModel::find(1);
//        dump($user->visible(['id','name','email'])->toArray());

//        $user = AdminModel::find(1);
//        dd($user->toArray());


    }


    public function login(Request $request)
    {
       // $uid =$request->header('uid','');
        // 获取模块名称
        $module = app('http')->getName();
        // 获取控制器
        $controller = request()->controller();
        // 获取方法
        $action = request()->action();

        //dd($action);

        $username = $request->post('username','','trim');//dd($username);


        $userInfo=Db::table('test')->where('name',$username)->find();

        if (!$userInfo){
            return error(0,'该用户不存在');
        }

        session('user'.$userInfo['id'],$userInfo['id']);

        //

//        dd($userInfo);
//
//        dd($module,$controller,$action);

        return success(1,'登录成功');
    }

    public function add(Request $request)
    {
        try {
            $data=$request->post();
            $res=validate(UserValidate::class)->check($data);
            if ($res){
                dd($data);
            }
            dd(111,$res);
        } catch (ValidateException $e) {

            return error(0,$e->getError());
            // 验证失败 输出错误信息
            dump($e->getError());
        }
    }

}
